from estadoFase import EstadoFase, db_session
from sqlalchemy import exc
from flask import flash
from relacion import relacion, Relacion
session = db_session()

class RelacionManager(object):
    """Clase encargada del manejo de relaciones entre items"""
    def __init__(self):
        pass
    def __repr__(self):
        return '<Relacion Manager>'
    
    def guardarRelacion(self, relacion):
        """
        Metodo encargado de almacenar una relacion en la base de datos
        @param relacion: Objeto relacion que se desea guardar.
        """
        session.add(relacion)
        try:
            session.commit()
        except exc.IntegrityError as ex:
            session.rollback()
            return flash("La relacion ya existe", "error")
        except exc.FlushError as ex:
            session.rollback()
            return flash("La relacion ya existe", "error")
        else:
            return flash("Relacion registrada exitosamente")
#        session.close()
        
    def eliminarRelacion(self, iditem1, iditem2):
        """
        Metodo encargado de eliminar una relacion de la base de datos
        @param iditem1: id de uno de los item de la relacion que se desea eliminar.
        @param iditem2: id del otro item de la relacion que se desea eliminar.
        """
#        session = db_session()
        relacion = session.query(Relacion).filter(Relacion.iditem1 == iditem1).\
        filter(Relacion.iditem2 == iditem2).first()
        session.delete(relacion)
        session.commit()
        
    def getRelacion(self, iditem1, iditem2):
        """
        Metodo encargado de retornar la relacion dado su idrelacion
        @param iditem1: id de uno de los item de la relacion que se desea obtener.
        @param iditem2: id del otro item de la relacion que se desea obtener.
        """
        relacion = session.query(Relacion).filter(Relacion.iditem1 == iditem1).\
        filter(Relacion.iditem2 == iditem2).first()
        return relacion
    
    def getRelaciones(self):
        """Metodo encargado de retornar todas las relaciones"""
        relaciones = session.query(Relacion).all()
        return relaciones
    
    def getRelacionesProyecto(self, idproyecto):
        """
        Metodo encargado de retornar todas las relaciones de un proyecto
        @param idproyecto: id del proyecto cuyas relaciones se desean obtener.
        """
        relaciones = session.query(Relacion).all()
        relacionesProyecto=[]
        for relacion in relaciones:
            if relacion.item1.fase.proyecto.idproyecto==idproyecto:
                relacionesProyecto.append(relacion);
        
        return relacionesProyecto
    
#     def getRelacionFiltradoPorNombre(self, nombre):
#         """Metodo encargado de retornar una relacion dado su nombre"""
#         if nombre == "":
#             nombre = "%"
#         else:
#             nombre = "%" + nombre + "%"
#         relacion = session.query(Relacion).filter(Relacion.nombre.like(nombre))
#         return relacion
#     
#     def getTipoRelacionPorNombre(self, nombre):
#         """Metodo encargado de retornar una relacion dado su nombre"""
#         relacion = session.query(Relacion).filter(Relacion.nombre == nombre).first()
#         return relacion